/*
 * calcular-RTT.h
 *
 *  Created on: 05/07/2011
 *      Author: McEdd
 */

#ifndef CALCULARRTT_H_
#define CALCULARRTT_H_

#include <stdlib.h>
#include <string>
#include <fstream>
#include <iostream>

using namespace std;

ofstream resRTTsOUT("datos/resultadosRTTs.txt");//estadisticas

int calcularTamannoPkt(){
	float t;
	int byte1, byte2;
	ifstream in1("datos/servidor-ACKs.txt");//acks todo servidor
	in1>>t>>byte1;
	in1>>t>>byte2;
	in1.close();
	return byte2 - byte1;
}

void estimacionRTT(float &estimadoRTT,float muestraRTT){

	float alfa=0.125;// 1/8
	estimadoRTT= (1-alfa)*estimadoRTT + alfa*muestraRTT;

}

int calculaRTT(){

	int flag=1;

	int tamPkt = calcularTamannoPkt();

	float tiempoAck, tiempoData;
	float rtt, acumRTTtodos, acumRTTexact, estimadoRTT1, estimadoRTT2;
	int byteAck, byteData;
	int cantRTTexact, cantRTTtodos;

	ifstream in1("datos/servidor-ACKs.txt");//acks todo servidor
	ifstream in2("datos/servidor-DATApkts.txt");//toda la data servidor

	ofstream out1("datos/rtts1-exactos.txt");//solo exactos (rtt, byte, tiempo del ack)
	ofstream out2("datos/rtts2-exactyaprox.txt");//exactos y aproximados
	ofstream out3("datos/rtts1-estimados.txt");
	ofstream out4("datos/rtts2-estimados.txt");

	tiempoAck=0.0;

	cantRTTtodos=0;
	cantRTTexact=0;

	acumRTTtodos=0.0;
	acumRTTexact=0.0;

	estimadoRTT1=0.0;
	estimadoRTT2=0.0;

	while((!in1.eof())&&(!in2.eof())){

		while(!in2.eof()){//DATA pkts (busque el sig DATApkt)

			in2>>tiempoData>>byteData;
			if(tiempoData>tiempoAck){//toma ese DATApkts
				byteData = byteData + tamPkt;//1448 = tamano del pkt
				break;
			}
		}

		while(!in1.eof()){//acks (busque el ACK correspondiente)
			in1>>tiempoAck>>byteAck;

			if(byteAck >= byteData){

				rtt=tiempoAck-tiempoData;
				cantRTTtodos++;//num RTTs calculados
				acumRTTtodos = acumRTTtodos + rtt;

				out2<<rtt<<"\t"<<byteAck<<"\t"<<tiempoAck<<endl;//RTT para grafica (todos: approx + exactos)
				estimacionRTT(estimadoRTT1,rtt);//estimacion rtt
				out4<<estimadoRTT1<<"\t"<<byteAck<<"\t"<<tiempoAck<<endl;//RTT estimado para grafica

				if(byteData==byteAck){//DATApkts que tienen correspondiente ACK que lo reconoce (exacto)
					out1<<rtt<<"\t"<<byteAck<<"\t"<<tiempoAck<<endl;//rtt para grafica
					estimacionRTT(estimadoRTT2,rtt);//estimacion rtt
					out3<<estimadoRTT2<<"\t"<<byteAck<<"\t"<<tiempoAck<<endl;//RTT estimado para grafica

					acumRTTexact = acumRTTexact + rtt;
					cantRTTexact++;
				}
				break;
			}//else tomar siguiente acks
		}
	}

	float prom;

	//RTT exactos
	if(cantRTTexact!=0){
		prom=acumRTTexact/cantRTTexact;
	}else{
		prom=0;
	}
	resRTTsOUT<<"PROMEDIO 1: "<<prom<<" seg, de "<<cantRTTexact<<" RTT calculados (solo exactos)"<<endl;

	//RTT todos: aproximados y exactos
	if(cantRTTtodos!=0){
		prom=acumRTTtodos/cantRTTtodos;
	}else{
		prom=0;
	}
	resRTTsOUT<<"PROMEDIO 2: "<<prom<<" seg, de "<<cantRTTtodos<<" RTT calculados (exactos con aproximados)"<<endl;

	//proporcion : exactos / total
	float porcent;
	if(cantRTTtodos!=0){
		porcent=(cantRTTexact*100.0)/cantRTTtodos;
	}else{
		porcent=0.0;
	}
	resRTTsOUT<<"\t\t\t"<<porcent<<"% de los RTTs fueron calculados exactos"<<endl;//relacion

	in1.close();
	in2.close();

	out2.close();
	out1.close();
	out3.close();
	out4.close();

	return flag;
}

#endif /* CALCULARRTT_H_ */
